package dao;

import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Time;
import java.text.DateFormat;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import javax.swing.text.StyleContext.SmallAttributeSet;

import com.sun.jmx.snmp.Timestamp;

import negocio.Carrier;
import negocio.Comprobante;
import entity.ComprobanteBD;
import entity.EmpresaBD;
import entity.ItemComprobanteBD;
import fachade.PrincipalFachade;

public class ComprobanteDAO extends DAO{

	public ComprobanteDAO(){}

	public List<EmpresaBD> getClientesPendientesAFacturar() {
		List<EmpresaBD> empresasDB = null;
		
		//este query hay que modificarlo
		String query = "select id_empresa,razon_social,id_pais,domicilio,id_localidad,id_provincia,pagina_web,email,fecha_alta,telefono,fax,direccion_comercial,tipo_factura,observaciones,fecha_inhabilitacion,cuit,dia_consolidacion,tipo_empresa  from Empresa";
		
		try {
			ResultSet rs = super.executeQuery(query);

			while(rs.next()){
				if(empresasDB == null)
					empresasDB = new LinkedList<EmpresaBD>();
				EmpresaBD empresaBD =  new EmpresaBD();
				empresaBD.setId_empresa(rs.getInt("id_empresa"));
				empresaBD.setRazon_social(rs.getString("razon_social"));
				empresaBD.setPais(PrincipalFachade.getInstance().getiEmpresaFachade().getPaisByID(rs.getInt("id_pais")));
				empresaBD.setLocalidad(PrincipalFachade.getInstance().getiEmpresaFachade().getLocalidadByID(rs.getInt("id_localidad")));
				empresaBD.setPagina_web(rs.getString("pagina_web"));
				empresaBD.setEmail(rs.getString("email"));
				empresaBD.setFecha_alta(rs.getDate("fecha_alta"));
				empresaBD.setTelefono(rs.getString("telefono"));
				empresaBD.setFax(rs.getString("fax"));
				empresaBD.setDireccion_comercial(rs.getString("direccion_comercial"));
				empresaBD.setTipo_factura(rs.getString("tipo_factura"));
				empresaBD.setObservaciones(rs.getString("observaciones"));
				empresaBD.setFecha_inhabilitacion(rs.getDate("fecha_inhabilitacion"));
				empresaBD.setCuit(rs.getString("cuit"));
				empresaBD.setDiaConcicliacion(rs.getInt("dia_consolidacion"));
				empresaBD.setTipo_empresa(rs.getString("tipo_empresa"));
				empresaBD.setDomicilio(rs.getString("domicilio"));
				
				empresasDB.add(empresaBD);
			}
			
//			empresasDB.add(new EmpresaBD().getCarrierTest());
//			empresasDB.add(new EmpresaBD().getCarrierTest2());

			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return empresasDB;
	}

	public Integer guardarComprobante(Comprobante nuevoComprobante) {
		
		ComprobanteBD nComprobanteBD = new ComprobanteBD(nuevoComprobante);
		//java.sql.Date sqlDate = new java.sql.Date(nComprobanteBD.getFecha_trafico_desde());
		nComprobanteBD.setNumero_comprobante(this.getNroComprobante());
		
//		String fecha_desde = nuevoComprobante.getFechaDesde().getDay()+"-"+nuevoComprobante.getFechaEmision().getMonth()+"-"+nuevoComprobante.getFechaEmision().getYear();
		
		java.util.Date utilDate = nuevoComprobante.getFechaDesde();
		java.util.Date utilHasta = nuevoComprobante.getFechaHasta();
		
		Format formatter = new SimpleDateFormat("dd-MM-yyyy");
		String fDesde = formatter.format(utilDate);
		String fHasta = formatter.format(utilHasta);

		
		
		String query = "set dateformat dmy insert into comprobante (numero_comprobante, id_empresa, fecha_emision, fecha_trafico_desde, fecha_trafico_hasta, tipo_comprobante, observaciones) " +
				"select " 
				+ nComprobanteBD.getNumero_comprobante() + ", "
						+ "" + nComprobanteBD.getEmpresa().getId_empresa()+","
								+ "getdate(),"
//								+nComprobanteBD.getFecha_trafico_desde()+","
								+"'"+fDesde+"',"
//										+ nComprobanteBD.getFecha_trafico_hasta()+","
										+"'"+fHasta+"',"
												+ "'"+nuevoComprobante.getTipoComprobante()+"',"
														+ "'"+nuevoComprobante.getObservaciones()+"'";
		super.persist(query);
		
		ResultSet rs = super.executeQuery("select id_comprobante from comprobante where numero_comprobante = " + nComprobanteBD.getNumero_comprobante());
		try {
			if(rs.next())
				nComprobanteBD.setId_comprobante(rs.getInt(1));
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		for (Iterator iterator = nComprobanteBD.getItemsComprobante().iterator(); iterator.hasNext();) {
			ItemComprobanteBD itemComprobante = (ItemComprobanteBD) iterator.next();
			this.insertarItemComprobante(itemComprobante, nComprobanteBD.getId_comprobante());
		}
		this.actualizarTablaTraficoNumeroCorto(nComprobanteBD);
		
		return nComprobanteBD.getNumero_comprobante();
	}

	private void actualizarTablaTraficoNumeroCorto(ComprobanteBD nuevoComprobante) {
		String query = "";
		if( nuevoComprobante.getEmpresa().getTipo_empresa().equalsIgnoreCase("Carrier") ){
		 	query ="update trafico_numero_corto set facturado_carrier = 1 "
					+ "where codigo_carrier = " + nuevoComprobante.getEmpresa().getId_empresa() + ""
							+ " and fecha between '"+ nuevoComprobante.getFecha_trafico_desde() +"' and '"+ nuevoComprobante.getFecha_trafico_hasta() +"'";
		}
		else{
		 	query ="update trafico_numero_corto set facturado_cliente = 1 "
		 			+ " from trafico_numero_corto "
		 			+ " join campania on trafico_numero_corto.id_campania = campania.id_campania "
					+ " where 1=1 "
							+ " and fecha between '"+ nuevoComprobante.getFecha_trafico_desde() +"' and '"+ nuevoComprobante.getFecha_trafico_hasta() +"' "
									+ " and campania.id_empresa = " + nuevoComprobante.getEmpresa().getId_empresa();
		}
		super.persist(query);
	}

	private Integer getNroComprobante() {
		ResultSet rs = super.executeQuery("if exists(select 1 from (select count(1) as cr from comprobante)a where a.cr>0) " +
				"select max(comprobante.numero_comprobante)+1 from comprobante " + " else " + "select 1 ");
		try {
			if(rs.next())
				return rs.getInt(1);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	private void insertarItemComprobante(ItemComprobanteBD itemComprobante,
			Integer numComprobante) {
		String query ="insert into item_comprobante (id_comprobante, id_concepto, precio_unitario, cantidad) select " +
				""+numComprobante+","+itemComprobante.getConceptoBD().getId_concepto()+",'"+itemComprobante.getPrecio_unitario()+"',"+itemComprobante.getCantidad();
		super.persist(query);
	}

	public Integer getProximoNumeroComprobante() {
		return this.getNroComprobante();
	}
}
